﻿#ifndef THREADPOOL_H
#define THREADPOOL_H

#include <thread>
#include <mutex>
#include <queue>
#include <functional>
#include <condition_variable>

// 定义任务类型
typedef std::function<void()> Task;

class ThreadPool
{
public:
    ThreadPool();
    ~ThreadPool();

    //初始化线程池
    void initThreadPool(int threadNum = 4);
    //释放线程池
    void releaseThreadPool();

    //添加任务 方式1
    void commitTask(Task task);
    //添加任务 方式2
    template <typename F, typename... Args>
    void commitTaskEx(F &&f, Args && ... args)
    {
        Task task = std::bind(std::forward<F>(f), std::forward<Args>(args)...);

        {
            std::lock_guard<std::mutex> lock(m_mutex);
            m_tasks.emplace(task);
        }

        m_cond.notify_one();
    }

public:
    // 停止标志
    bool m_stop;

private:
    // 线程队列
    std::vector<std::thread> m_workers;
    // 任务队列
    std::queue<Task> m_tasks;
    // 互斥锁
    std::mutex m_mutex;
    // 条件变量
    std::condition_variable m_cond;
};

#endif // THREADPOOL_H
